【Codewars每日一题】- Sum without highest and lowest number

题目

题目地址

Sum all the numbers of the array (in F# and Haskell you get a list) except the highest and the lowest element (the value, not the index!).
(The highest/lowest element is respectively only one element at each edge, even if there are more than one with the same value!)

Example:

1
2
{ 6, 2, 1, 8, 10 } => 16
{ 1, 1, 11, 2, 3 } => 6

If array is empty, null or None, or if only 1 Element exists, return 0.
Note:In C++ instead null an empty vector is used. In C there is no null. ;-)

思路

首先想到的就是对list进行排序,然后剔除最大值和最小值,最后求和。
另外,可以结合之前在python cookbook中看到的list中分解元素的方法。

答案

我的答案

1
2
3
4
5
6
def sum_array(arr):
if None == arr or len(arr)<3:
return 0
arr.sort()
_,*result,_ = arr
return sum(result)

最佳答案

1
2
3
4
def sum_array(arr):
if arr == None or len(arr) < 3:
return 0
return sum(arr) - max(arr) - min(arr)
1
2
def sum_array(arr):
return 0 if arr == None else sum(sorted(arr)[1:-1])

最佳答案中结合使用了list的各种方法,答案一中使用了sum()min()max()方法,而无需再进行排序操作,另外第二个答案巧妙地使用了[1:-1]来对排序后的结果进行切片,但是都需要考虑入参是None的情况。

知识点

list.sort()和sorted()

sort()sorted()的不同在于,sort()是在原位重新排列列表,而sorted()产生一个新的列表,也就是说sorted()函数有一个copy的过程,这样多少会带来性能的损耗。另外二者的使用方法也有不同。

描述

sort()函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。需要注意的是该方法没有返回值,但是会对列表的对象进行排序。因此当直接print(arr.sort())时得到了一个None

1
2
3
>>> a = [2,334,12,4,6]
>>> print(a.sort())
None

sorted()函数对所有可迭代的对象进行排序操作。会返回重新排序的列表。

1
2
3
>>> a = [2,334,12,4,6]
>>> print(sorted(a))
[2, 4, 6, 12, 334]

语法

list.sort([func])

  • func – 可选参数, 如果指定了该参数会使用该参数的方法进行排序。

sorted(iterable[, cmp[, key[, reverse]]])

  • iterable – 可迭代对象。
  • cmp – 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
  • key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse – 排序规则,reverse = True降序 , reverse = False升序(默认)。

示例

1
2
3
4
5
6
7
8
9
10
>>> a = [2,334,12,4,6]
>>> a
[2, 334, 12, 4, 6]
>>> sorted(a)
[2, 4, 6, 12, 334]
>>> a
[2, 334, 12, 4, 6]
>>> a.sort()
>>> a
[2, 4, 6, 12, 334]
hoxis wechat
一个脱离了高级趣味的程序员,关注回复1024有惊喜~
赞赏一杯咖啡
0%